package com.jason.mychartstest;

import android.*;
import android.Manifest;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.listener.ChartTouchListener;
import com.github.mikephil.charting.listener.OnChartGestureListener;
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
import com.jason.mychartstest.customview.CYDataLineChart;
import com.jason.mychartstest.customview.MyMarkView;
import com.jason.mychartstest.permistion.PermissionsActivity;
import com.jason.mychartstest.permistion.PermissionsChecker;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private CYDataLineChart lineChart;
    MyMarkView mv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lineChart = (CYDataLineChart) findViewById(R.id.lineChart);

        lineChart.setOnChartGestureListener(mOnChartGestureListener);

        lineChart.setOnChartValueSelectedListener(mOnChartValueSelectedListener);


        // 如果打开 背景矩形将出现在已经画好的绘图区域的后边
        lineChart.setDrawGridBackground(false);
        lineChart.setDescription("描述信息");
        lineChart.setNoDataTextDescription("没有数据信息");

        // 允许你打开或者关闭与图表的所有触摸交互的情况
        lineChart.setTouchEnabled(true);
        // 打开或关闭对图表的拖动
        lineChart.setDragEnabled(true);
        // 打开或关闭对图表所有轴的缩放
        lineChart.setScaleEnabled(false);

//        lineChart.setScaleXEnabled(true); // 打开或关闭x轴的缩放
//        lineChart.setScaleYEnabled(true); // 打开或关闭y轴的缩放

        // 如果设置为true,挤压缩放被打开.如果设置为false, x轴和y轴可以被单独挤压缩放
        lineChart.setPinchZoom(true);

        mv = new MyMarkView(this, R.layout.custom_view);
        lineChart.setMarkerView(mv);


        // LimitLines 允许呈现具体的信息,像边框或者限制 (也称指示线)是明确和简单的线能给使用者提供额外的信息
        LimitLine limitLine = new LimitLine(10f, "index 10");
        limitLine.setLineWidth(20f);
        limitLine.enableDashedLine(10f, 10f, 0f);// 1.部分线的长度 2.两个部分之间的控件 3.偏移,以度为单位一般用0代替
        limitLine.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
        limitLine.setTextSize(30f);


        LineData lineData = setData(6, 10, 0.6, 15);
        lineChart.setMaxVisibleValueCount(0);

        /**
         *    XAxis是AxisBase的子类
         *    XAxis类(在2.0.0之前是XLabels),是一切与水平轴相关的数据和信息的容器
         *    每个Line-, Bar-, Scatter CandleStickChart和RadarChart都有一个XAxis对象,XAxis将显为一个Arraylist或者String[]
         *    交给CharData对象的是什么.
         *    XAxis类允许对下面的组件或部分指定具体的样式：
         *      1. 标签(绘制时水平对齐),包括轴的描述值,这些包括提供的数据对象你为图表设置的(x轴的值)
         *      2. 坐标轴, 它直接被绘制平行于标签旁边.
         *      3. 网格线, 每个来自垂直方向的标签轴
         */
        XAxis xAxis = lineChart.getXAxis(); // 获取XAxis的实例
        /*xAxis.setValueFormatter(new XAxisValueFormatter() {  设置自定义的ValueFormatter为此数据对象所包含的所有数据集
            @Override
            public String getXValue(String original, int index, ViewPortHandler viewPortHandler) {
                return null;
            }
        });*/
//        xAxis.addLimitLine(limitLine); // 添加一个新的LimitLine到轴上

        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setAxisLineColor(R.color.y_linedataset_color);
        xAxis.setDrawGridLines(false); // 隐藏网格线

        YAxis axisRight = lineChart.getAxisRight();
        axisRight.setDrawLabels(false);
        axisRight.setDrawGridLines(false); //
        YAxis axisLeft = lineChart.getAxisLeft();
        axisLeft.setDrawLabels(false);
        axisLeft.setDrawGridLines(false);

        lineChart.getAxisLeft().setEnabled(false);
        lineChart.getAxisRight().setEnabled(false);


        setChartStyle(lineData, Color.WHITE);


    }


    private void setChartStyle(LineData lineData, int white) {

        lineChart.setDrawBorders(false); // 打开或关闭绘制的图表边框
        lineChart.setBorderColor(Color.TRANSPARENT);

        lineChart.setDescription(null);
        lineChart.setNoDataTextDescription("暂无数据");

        lineChart.setDrawGridBackground(false); // 如果打开,背景矩形将出现在已经画好的绘图区域的后边
        lineChart.setGridBackgroundColor(white);

        lineChart.setBackgroundColor(Color.parseColor("#FFFAA394"));
        lineChart.setData(lineData);


    }

    private LineData setData(int mouth, double expected_earning_rate, double additional, double rate_end) {

        ArrayList<String> xlist = new ArrayList<>();
        for (int i = 0; i < mouth; i++) {
            // x轴显示的数据
            xlist.add((i + 1) + "个月");
        }

        // y轴的数据
        ArrayList<Entry> yList = new ArrayList<>();
        for (int i = 0; i < mouth; i++) {
            float temp = (float) (expected_earning_rate + i * additional);
            if (temp <= rate_end) {
                float num = temp;
                yList.add(new Entry(num, i));
            } else {
                float num = (float) rate_end;
                yList.add(new Entry(num, i));
            }


        }

        int[] colors = {R.color.out_circle_color, R.color.out_circle_color};

        // y轴数据集

        LineDataSet lineDataSet = new LineDataSet(yList, "");
        // y轴的集合来设置参数
        lineDataSet.setLineWidth(2.0f);
        lineDataSet.setColor(R.color.y_linedataset_color); //
        lineDataSet.setCircleColor(R.color.red_color_4c); // 为这个数据集应该有的所有圆设置颜色
        lineDataSet.setCircleColors(colors); // 为这个数据集的圆外设置颜色 也有各种各样的其他方法设置圆的颜色
        lineDataSet.setCircleColorHole(R.color.red_color_4c); // 设置圆内颜色

        lineDataSet.setDrawHighlightIndicators(true); // 设置交叉十字线
        lineDataSet.setDrawVerticalHighlightIndicator(true);
        lineDataSet.setDrawHorizontalHighlightIndicator(false);
        lineDataSet.setHighLightColor(Color.BLUE);

        lineDataSet.setValueTextSize(8.0f);
        lineDataSet.setDrawCircleHole(true);// 设置这个为true允许在这个数据集的每个圆内绘制一个洞。如果设置为false，圆将被绘制填满（没有洞）
        lineDataSet.setDrawCubic(true); // 如果设置为true,linechart线被绘制在立方体中,代替linear,这对性能有负面影响,默认false
        lineDataSet.setCubicIntensity(0.1f); // 为立方线设置强度. 最大值1f代表高立方效果,最小值0.05f代表低立方效果 默认为0.2f

        // 填充曲线下方的区域颜色
        lineDataSet.setDrawFilled(true);
        lineDataSet.setFillAlpha(100);
        lineDataSet.setFillColor(R.color.out_circle_color);
        lineDataSet.setDrawValues(true);
        // 设置折线上显示数据的格式,如果不设置,将默认显示float数据格式
      /*  lineDataSet.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                int n = (int) value;
                return n + "";
            }
        });*/

        ArrayList<ILineDataSet> listLineDataSet = new ArrayList<>();
        listLineDataSet.add(lineDataSet);

        LineData lineData = new LineData(xlist, listLineDataSet);


        return lineData;


    }


    private OnChartValueSelectedListener mOnChartValueSelectedListener = new OnChartValueSelectedListener() {
        @Override
        public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
            int xIndex = e.getXIndex();


        }

        @Override
        public void onNothingSelected() {

        }
    };

    private OnChartGestureListener mOnChartGestureListener = new OnChartGestureListener() {
        @Override
        public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {

        }

        @Override
        public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) {

        }

        @Override
        public void onChartLongPressed(MotionEvent me) {

        }

        @Override
        public void onChartDoubleTapped(MotionEvent me) {

        }

        @Override
        public void onChartSingleTapped(MotionEvent me) {

        }

        @Override
        public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) {

        }

        @Override
        public void onChartScale(MotionEvent me, float scaleX, float scaleY) {

        }

        @Override
        public void onChartTranslate(MotionEvent me, float dX, float dY) {

        }
    };
}
